package cn.csc.module.product.service.collect;

import cn.csc.framework.common.pojo.PageResult;
import cn.csc.framework.web.core.util.WebFrameworkUtils;
import cn.csc.module.product.controller.admin.collect.vo.SpuCollectCreateReqVO;
import cn.csc.module.product.controller.admin.collect.vo.SpuCollectExportReqVO;
import cn.csc.module.product.controller.admin.collect.vo.SpuCollectPageReqVO;
import cn.csc.module.product.controller.admin.collect.vo.SpuCollectUpdateReqVO;
import cn.csc.module.product.convert.collect.SpuCollectConvert;
import cn.csc.module.product.dal.dataobject.collect.SpuCollectDO;
import cn.csc.module.product.dal.dataobject.spu.SpuDO;
import cn.csc.module.product.dal.mysql.collect.SpuCollectMapper;
import cn.csc.module.product.service.spu.SpuService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

import javax.annotation.Resource;
import java.math.BigInteger;
import java.util.Collection;
import java.util.List;

import static cn.csc.framework.common.exception.enums.GlobalErrorCodeConstants.UNAUTHORIZED;
import static cn.csc.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.csc.module.product.enums.ErrorCodeConstants.SPU_COLLECT_FAIL;
import static cn.csc.module.product.enums.ErrorCodeConstants.SPU_COLLECT_IN_EXISTS;


/**
 * 收藏商品信息 Service 实现类
 *
 * @author 华南城
 */
@Slf4j
@Service
@Validated
public class SpuCollectServiceImpl implements SpuCollectService {

    @Resource
    private SpuCollectMapper spuCollectMapper;
    @Resource
    private SpuService spuService;

    @Override
    public BigInteger createSpuCollect(SpuCollectCreateReqVO createReqVO) {
        Long userId = WebFrameworkUtils.getLoginUserId();
        if (userId == null)
            throw exception(UNAUTHORIZED);

        createReqVO.setUserId(new BigInteger(String.valueOf(userId)));
        // 插入
        SpuCollectDO spuCollectDO = spuCollectMapper.selectByOne(createReqVO);
        if (spuCollectDO != null) {
            throw exception(SPU_COLLECT_IN_EXISTS);
        }
        SpuDO spuDO = spuService.getSpu(createReqVO.getSpuId());
        if (spuDO != null) {
            createReqVO.setName(spuDO.getName());
            createReqVO.setPriceFee(spuDO.getPriceFee());
            createReqVO.setMainImgUrl(spuDO.getMainImgUrl());
        }
        SpuCollectDO spuCollect = SpuCollectConvert.INSTANCE.convert(createReqVO);
        spuCollectMapper.insert(spuCollect);
        // 返回
        return spuCollect.getId();
    }

    @Override
    public void updateSpuCollect(SpuCollectUpdateReqVO updateReqVO) {
        // 校验存在
        //validateSpuCollectExists(updateReqVO.getId());
        // 更新
        SpuCollectDO updateObj = SpuCollectConvert.INSTANCE.convert(updateReqVO);
        spuCollectMapper.updateById(updateObj);
    }

    @Override
    public void deleteSpuCollect(BigInteger id) {
        // 校验存在
        //validateSpuCollectExists(id);
        // 删除
        spuCollectMapper.deleteById(id);
    }


    @Override
    public void delSpuCollect(SpuCollectCreateReqVO createReqVO) {
        Long userId = WebFrameworkUtils.getLoginUserId();
        if (userId == null)
            throw exception(UNAUTHORIZED);

        createReqVO.setUserId(new BigInteger(String.valueOf(userId)));
        // 删除
        if(spuCollectMapper.del(createReqVO) <=0)
             throw exception(SPU_COLLECT_FAIL);
    }

//    private void validateSpuCollectExists(BigInteger id) {
//        if (spuCollectMapper.selectById(id) == null) {
//            throw exception(SPU_COLLECT_NOT_EXISTS);
//        }
//    }

    @Override
    public SpuCollectDO getSpuCollect(BigInteger id) {
        return spuCollectMapper.selectById(id);
    }

    @Override
    public List<SpuCollectDO> getSpuCollectList(Collection<BigInteger> ids) {
        return spuCollectMapper.selectBatchIds(ids);
    }

    @Override
    public PageResult<SpuCollectDO> getSpuCollectPage(SpuCollectPageReqVO pageReqVO) {
        return spuCollectMapper.selectPage(pageReqVO);
    }

    @Override
    public List<SpuCollectDO> getSpuCollectList(SpuCollectExportReqVO exportReqVO) {
        return spuCollectMapper.selectList(exportReqVO);
    }

    @Override
    public SpuCollectDO getSpuByOne(SpuCollectCreateReqVO createReqVO) {
        return spuCollectMapper.selectByOne(createReqVO);
    }
}
